package com.atguigu.mvc.exception;

import com.atguigu.mvc.util.AtguiguUtil;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

// 异常处理器类需要使用专门的注解：
@ControllerAdvice
public class MyExceptionResolver {

    // 将一个异常类型和当前方法关联起来
    @ExceptionHandler(value = NullPointerException.class)
    public String resolveNullPointerException(

            // SpringMVC 会将捕获到的异常对象从形参位置传入
            Exception exception, Model model) {

        // 将异常对象存入模型
        model.addAttribute("aggException",exception);

        // 返回逻辑视图名称
        return "error-annotation";
    }

    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public String resolveArrayOutOfBoundException(
            Exception exception,
            Model model,
            HttpServletRequest request,
            HttpServletResponse response) throws IOException {

        // 1、判断当前请求是否为 Ajax 请求
        boolean judgeResult = AtguiguUtil.judgeRequestType(request);

        if (judgeResult) {

            // 2、如果是 Ajax 请求，则需要返回数据片段（JSON格式或文本或其他JavaScript能够解析的数据格式）
            String responseBody = "服务器端抛出了异常：数组下标越界";

            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write(responseBody);

            // 3、上面已经给出了响应，所以当前方法不需要返回逻辑视图了
            return null;
        }

        // 4、如果当前请求不是 Ajax 请求，返回逻辑视图
        model.addAttribute("aggException", exception);

        return "error-annotation";
    }

}
